!===========Programa que ordena números lidos de um arquivo============

PROGRAM exec05

!======================================================================

IMPLICIT NONE

!==============================Variáveis===============================

      INTEGER :: M, N, I, J
      REAL(4), ALLOCATABLE, DIMENSION(:) :: ord !Vetor de tamanho dinâmico
      REAL(4) :: aux

!============================Abre o arquivo============================

      OPEN(UNIT=10, FILE='ord_inp.dat', STATUS='old')
      OPEN(UNIT=20, FILE='ord_out.dat', STATUS='old')

!===========================Leitura dos dados==========================

      N = -1
      DO WHILE (N<=0)
            WRITE(*,*) 'Entre com o número N de números a serem &
            &lidos do arquivo (N>0) '
            READ(*,*) N
      END DO 
      M = N + 1
      DO WHILE (M>N .OR. M<0)
            WRITE(*,*) 'Entre com o número M de menores números &
            &a serem retornados (M<=N)'
            READ(*,*) M
      END DO 

!====================Aloca a memória do vetor ord======================

      ALLOCATE(ord(N))

!=======================Inicializa variáveis===========================

      DO I=1,N
            ord(I) = 0.0
      END DO

!================Escreve dados do arquivo no vetor ord=================

      DO I=1,N
            READ(10,*) ord(I)
      END DO

!===================Ordena o vetor ord (bubblesort)====================

      DO I=1,N-1
            DO J=1+i,N
                  IF (ord(I) > ord(J)) THEN
                        aux = ord(I)
                        ord(I) = ord(J)
                        ord(J) = aux
                  END IF
            END DO
      END DO

!==============Imprime no arquivo os M menores números================

      DO I=1,M
            WRITE(20,*) ord(I)
      END DO

!========================Desaloca o vetor ord==========================

      DEALLOCATE(ord)

!======================================================================

END PROGRAM exec05
